/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.commons.lang;

/**
 * Set of useful String methods
 */
public class StringUtils {

    /**
     * Trim last char of the string if string ends with that char.
     *
     * @param s      the string to trim
     * @param suffix the suffix
     * @return trimmed string
     */
    public static String trimEnd(String s, char suffix) {
        if (endWithChar(s, suffix)) {
            return s.substring(0, s.length() - 1);
        }
        return s;
    }

    /**
     * Check if string ends with char.
     */
    public static boolean endWithChar(String s, char suffix) {
        return s != null && !s.isEmpty() && s.charAt(s.length() - 1) == suffix;
    }

    /**
     * Add to builder 'times' symbol 'symbol'
     */
    public static void repeatSymbol(StringBuilder builder, char symbol, int times) {
        for (int i = 0; i < times; i++) {
            builder.append(symbol);
        }
    }

    /**
     * Check if CharSequence end with suffix
     */
    public static boolean endWith(CharSequence builder, CharSequence suffix) {
        int bl = builder.length();
        int sl = suffix.length();
        if (bl < sl) {
            return false;
        }

        for (int i = bl - 1; i >= bl - sl; i--) {
            if (builder.charAt(i) != suffix.charAt(i + sl - bl)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Check that char sequences are equal
     */
    public static boolean equals(CharSequence c1, CharSequence c2) {
        if (c1 == null ^ c2 == null) {
            return false;
        }

        if (c1 == null) {
            return true;
        }
        if (c1.length() != c2.length()) {
            return false;
        }

        for (int i = 0; i < c1.length(); i++) {
            if (c1.charAt(i) != c2.charAt(i)) {
                return false;
            }
        }

        return true;
    }

    /**
     * Returns the index within this string of the last occurrence of the
     * specified char, searching in specified range
     */
    public static int lastIndexOf(CharSequence s, char c, int start, int end) {
        start = Math.max(start, 0);
        for (int i = Math.min(end, s.length()) - 1; i >= start; i--) {
            if (s.charAt(i) == c) {
                return i;
            }
        }
        return -1;
    }
}
